package com.itheima._12Collection同时删除和遍历查询问题;

import java.util.ArrayList;
import java.util.Iterator;

/**
 * @Description Demo121
 * @Author GreenHand_Lu
 * @Date 2025-07-19
 */
public class Demo121 {

    public static void main(String[] args) {
        //目标：掌握集合遍历三种方式(迭代器、增强for、fori)在并发修改遍历的区别

        //演示：遍历和修改同时操作产生的问题
        //fori的问题
        // test1();

        //fori的解决方案1：删除成功同时i--;
        // test2();
        //fori的解决方案2：从后往前删除;
        // test3();

        //迭代器的问题
        // test4();//产生问题的原因是使用集合删除导致的
        //解决方案：使用迭代器删除就不会有这个问题
        // test5();

        //增强for的问题并且无法解决
        test6();

    }

    private static void test6() {
        ArrayList<String> list = new ArrayList<>();
        list.add("Java入门");
        list.add("宁夏枸杞");
        list.add("黑枸杞");
        list.add("人字拖");
        list.add("特级枸杞");
        list.add("枸杞子");

        System.out.println("删除前数据：" + list);

        //删除包含枸杞的数据
        for (String s : list) {//底层使用的是迭代器获取每个元素
            if (s.contains("枸杞")) {
                list.remove(s);//但是这里没有办法获取迭代器对象，所以无法使用迭代器删除
            }
        }
        System.out.println("删除后数据：" + list);
    }

    private static void test5() {
        ArrayList<String> list = new ArrayList<>();
        list.add("Java入门");
        list.add("宁夏枸杞");
        list.add("黑枸杞");
        list.add("人字拖");
        list.add("特级枸杞");
        list.add("枸杞子");

        System.out.println("删除前数据：" + list);

        //删除包含枸杞的数据
        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()){
            String val = iterator.next();
            if (val.contains("枸杞")) {
                //list.remove(val); 这个集合删除元素，迭代器移动位置次数不会受删除元素影响。
                iterator.remove();//删除当前位置上一个元素，并且位置-1
            }
        }
        System.out.println("删除后数据：" + list);
    }



    private static void test4() {
        ArrayList<String> list = new ArrayList<>();
        list.add("Java入门");
        list.add("宁夏枸杞");
        list.add("黑枸杞");
        list.add("人字拖");
        list.add("特级枸杞");
        list.add("枸杞子");

        System.out.println("删除前数据：" + list);

        //删除包含枸杞的数据
        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()){
            String val = iterator.next();
            if (val.contains("枸杞")) {
                list.remove(val);
            }
        }
        System.out.println("删除后数据：" + list);
    }


    //fori的解决方案2：从后往前删除;
    private static void test3() {
        ArrayList<String> list = new ArrayList<>();
        list.add("Java入门");
        list.add("宁夏枸杞");
        list.add("黑枸杞");
        list.add("人字拖");
        list.add("特级枸杞");
        list.add("枸杞子");

        System.out.println("删除前数据：" + list);

        //删除包含枸杞的数据
        for (int i = list.size()-1; i >=0; i--) {
            //System.out.println(list.get(i));
            if (list.get(i).contains("枸杞")) {
                list.remove(list.get(i));
            }
        }
        System.out.println("删除后数据：" + list);
    }

    //fori的解决方案1：删除成功同时i--;
    private static void test2() {
        ArrayList<String> list = new ArrayList<>();
        list.add("Java入门");
        list.add("宁夏枸杞");
        list.add("黑枸杞");
        list.add("人字拖");
        list.add("特级枸杞");
        list.add("枸杞子");

        System.out.println("删除前数据：" + list);

        //删除包含枸杞的数据
        for (int i = 0; i < list.size(); i++) {
            //System.out.println(list.get(i));
            if (list.get(i).contains("枸杞")) {
                list.remove(list.get(i));
                i--;
            }
        }
        System.out.println("删除后数据：" + list);
    }

    private static void test1() {
        ArrayList<String> list = new ArrayList<>();
        list.add("Java入门");
        list.add("宁夏枸杞");
        list.add("黑枸杞");
        list.add("人字拖");
        list.add("特级枸杞");
        list.add("枸杞子");

        System.out.println("删除前数据：" + list);

        //删除包含枸杞的数据
        for (int i = 0; i < list.size(); i++) {
            //System.out.println(list.get(i));
            if (list.get(i).contains("枸杞")) {
                list.remove(list.get(i));
            }
        }

        System.out.println("删除后数据：" + list);//Java入门,黑枸杞,人字拖,枸杞子
        //遍历i=0：Java入门 留下  list={Java入门,宁夏枸杞,黑枸杞,人字拖,特级枸杞,枸杞子}
        //                                0    1       2    3     4       5
        //遍历i=1：宁夏枸杞 被删除掉 list={Java入门,黑枸杞,人字拖,特级枸杞,枸杞子}
        //                                0      1       2    3     4
        //遍历i=2：人字拖 留下 list={Java入门,黑枸杞,人字拖,特级枸杞,枸杞子}
        //                            0      1       2    3     4
        //遍历i=3：人字拖 留下 list={Java入门,黑枸杞,人字拖，枸杞子}
        //                            0      1       2    3
    }
}
